package com.chen.realm;

import com.chen.pojo.Admin;
import com.chen.service.AdminService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private AdminService adminService;
    //授权，认证之后会执行此方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("执行了授权方法==>doGetAuthorizationInfo");

        //由于我们把认证后的用户信息存在了SimpleAuthenticationInfo里面，所以我们需要创建授权对象来取
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

        //获取当前对象
        Subject subject = SecurityUtils.getSubject();
        Admin admin = (Admin) subject.getPrincipal();

        //使用授权对象进行获取权限
        info.addStringPermission(admin.getPerms());

        //获取的权限给它们
        return info;
    }

    //认证，登录的时候进行认证。
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证方法==>doGetAuthenticationInfo");
        //这个token相当于一个令牌，我们验证的时候用的，一般我们会强转成自己的
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

        //现在我们得到了用户所输入的用户名和密码，我们要去数据库中进行判断。
        //调用service,我们只需要用户名即可，密码shiro自动管理。！
        Admin user = adminService.getByUser(usernamePasswordToken.getUsername());
        //用户为空，抛出异常，controller进行接收。
        if (user==null){
            return null;
        }

        //密码认证,shiro 自己来做，第一个把对象放进全局对象中。
        return new SimpleAuthenticationInfo(user,user.getPassword(), "");
    }
}
